<?php
/**
 * @link https://www.kancloud.cn/cleverstone/ymb2
 * @copyright Copyright (c) 2020 Yii Manager Software LLC
 */

namespace builder\tree\util\oitem;

/**
 * AJAX类型
 * @author cleverstone
 * @since ym2.0
 */
class Ajax extends OperationType
{
    /**
     * @var string 位置, 只支持: top(默认), bottom(下部)
     */
    private $_position = 'top';

    /**
     * @var string 按钮标题
     */
    private $_title = 'ajax';

    /**
     * @var string 按钮图标
     */
    private $_icon = '';

    /**
     * @var string 按钮class样式
     */
    private $_btnClass = 'layui-btn-theme';

    /**
     * @var array 选项
     */
    private $_options = [
        'type' => 'ajax',   // 支持的类型有: page(页面), modal(模态框), ajax(AJAX)
        'params' => [],     // 请求参数, 默认主键
        'route' => '',      // 路由; 默认当前路由
        'method' => 'GET',  // 访问动作; type为ajax有效, 只支持GET、POST; 默认GET
        'questionTitle' => '', // 询问标题
        'questionDescription' => '确定要执行该操作么?', // 询问描述
        '__mustSelectCheckbox' => false,  // 是否必须选择checkbox
        'closeModal' => false,//是否关闭当前窗口层,用于当前树组件模态框展示时,ajax提交后自动关闭
        'submittedReload' => false,//是否提交后重载tree组件,默认false
        /**
         * 提交后的回调, 空数组代表不回调
         * - key 回调窗口
         *   self: 当前窗口
         *   parent: 父级窗口
         *   parent.parent.*: 祖先窗口
         *
         * - value 回调ID(构建器ID或自定义回调方法名称)
         *   构建器ID: 指定回调;指ym构建器组件ID; 如场景:一表格行操作和工具栏操作中的modal,如果modal关闭回调,则需要传入该表格的ID
         *   自定义回调方法名称: 指定回调;指的是window.ym2CbkExport对象中的调用方法名称
         *   value为空数组: 回调所有;代表回调window.ym2CbkExport中的所有方法
         */
        'submittedCalls' => [],
    ];

    /**
     * @param array|string $btnClass 按钮class样式
     * @return $this
     */
    public function btnClass($btnClass)
    {
        $this->_btnClass = $btnClass;
        return $this;
    }

    /**
     * 设置提交后关闭当前窗口层
     * @return $this
     */
    public function closeModal()
    {
        $this->_options['closeModal'] = true;
        return $this;
    }

    /**
     * 是否提交后重载tree组件
     * @return $this
     */
    public function submittedReload()
    {
        $this->_options['submittedReload'] = true;
        return $this;
    }

    /**
     * 提交后的回调, 空数组代表不回调
     * @param array $callback
     * @return $this
     */
    public function submittedCalls(array $callback = ['parent' => null])
    {
        foreach ($callback as $window => &$item) {
            if (empty($item)) {
                $item = [];
            } else {
                $item = (array)$item;
            }
        }

        $this->_options['submittedCalls'] = $callback;
        return $this;
    }

    /**
     * @param string $questionTitle 询问标题
     * @return $this
     */
    public function questionTitle($questionTitle)
    {
        $this->_options['questionTitle'] = $questionTitle;
        return $this;
    }

    /**
     * @param string $questionDescription 询问描述
     * @return $this
     */
    public function questionDescription($questionDescription)
    {
        $this->_options['questionDescription'] = $questionDescription;
        return $this;
    }

    /**
     * 位于下方
     * @return $this
     */
    public function positionBottom()
    {
        $this->_position = 'bottom';
        return $this;
    }

    /**
     * @param string $title 名称标题
     * ```php
     * // 文本标题
     * $this->title('提交');
     *
     * // 支持HTML
     * $this->title(H5::text('提交'));
     *
     * ```
     *
     * @return $this
     */
    public function title($title)
    {
        $this->_title = (string)$title;
        return $this;
    }

    /**
     * @param string $icon 按钮图标
     * 支持的图标有:
     * - bootstrap v4图标
     * - fontawesome v5
     * - layui 2.8图标
     *
     * @return $this
     */
    public function icon($icon)
    {
        $this->_icon = $icon;
        return $this;
    }

    /**
     * @param string|array $params 请求参数
     * one:
     * ```php
     * // 直接指定query中的字段
     * $this->params(['id']);
     *
     * ```
     *
     * two:
     * ```php
     * // key-value, 字段指定值
     * $this->params(['id' => 1]);
     *
     * ```
     *
     * three:
     * ```php
     * // key-占位符, 字段+字段占位符
     * $this->params(['action' => ':status']);
     *
     * ```
     * @return $this
     */
    public function params($params)
    {
        $params = (array)$params;
        foreach ($params as $key => $value) {
            if (is_int($key) || (is_string($value) && substr($value, 0, 1) == ':')) {
                $this->_options['__mustSelectCheckbox'] = true;
            }
        }

        $this->_options['params'] = $params;
        return $this;
    }

    /**
     * @param string $route 路由或外链
     * ```php
     * 可以直接指定路由
     * $this->route('user/edit');
     *
     * 也可以指定外部链接
     * $this->route('https://ym2.cleverstone.top');
     *
     * ```
     *
     * @return $this
     */
    public function route($route)
    {
        $this->_options['route'] = $route;
        return $this;
    }

    /**
     * @param string $method HTTP请求动作, 目前支持GET(助手默认), POST
     * @return $this
     */
    public function method($method = 'POST')
    {
        $this->_options['method'] = strtoupper($method);
        return $this;
    }

    /**
     * @return array
     */
    public function _toArray()
    {
        if (!empty($this->_options['route'])) {
            if (!$this->checkAccess($this->_options['route'])) {
                return [];
            }
        }

        $this->_options['route'] = $this->normalizeRoute($this->_options['route']);
        return [
            'position' => $this->_position,
            'title' => $this->_title,
            'icon' => $this->_icon,
            'btnClass' => $this->_btnClass,
            'options' => $this->_options,
        ];
    }
}